package modelos.daos;

import controladores.ManejadorBaseDatos;
import modelos.pojos.Reserva;
import modelos.pojos.ReservaSala;
import java.sql.*;
import java.util.LinkedList;
import java.util.List;
import org.apache.log4j.Logger;

public class ReservaSalaDAO {

    private static Connection con;
    public static List<ReservaSala> resultados;
    protected static Logger log = Logger.getLogger(ReservaSalaDAO.class);

    public static void crear(ReservaSala reservaSala) throws SQLException, Exception {

        ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
        mbd.conectar();
        con = mbd.getConexion();

        if (con == null) {
            throw new SQLException("Ha ocurrido un error al intentar conectarse con la base de datos");
        }

        PreparedStatement pst = null;

        try {
            pst = con.prepareStatement("Insert Into ReservaSala values(?,?,?,?,?,?,?,?)");
            pst.setString(1, null);
            pst.setInt(2, ReservaDAO.consultar(reservaSala.getReserva().getCodigoReserva()).getId());
            pst.setInt(3, reservaSala.getSala().getId());
            pst.setTimestamp(4, new Timestamp(reservaSala.getFechaProg().getTime()));
            pst.setString(5, reservaSala.getHoraInicio());
            pst.setString(6, reservaSala.getHoraFin());
            pst.setString(7, reservaSala.getDescripcion().trim());
            pst.setString(8, reservaSala.getEstado() + "");
            pst.executeUpdate();

        } finally {

            if (pst != null) {
                pst.close();
            }
        }
    }

    public static ReservaSala consultar(String codigoReserva, String numeroSala) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        ReservaSala reserva = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("Select ReservaSala.*,SalaEventos.id,SalaEventos.numero,Reserva.codigoReserva from ReservaSala inner join SalaEventos inner join Reserva on ReservaSala.idSala = SalaEventos.id and ReservaSala.idReserva = Reserva.id and ReservaSala.idReserva = ? and ReservaSala.idSala = ?");
            pst.setInt(1, ReservaDAO.consultar(codigoReserva).getId());
            pst.setInt(2, SalaEventosDAO.consultar(numeroSala).getId());
            rs = pst.executeQuery();

            while (rs.next()) {
                reserva = ReservaSala.cargarDatos(rs);
            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return reserva;
        }
    }

    public static List listarReservaSalas(String codigoReserva) throws SQLException {
        ResultSet rs = null;
        PreparedStatement pst = null;
        resultados = new LinkedList<ReservaSala>();
        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("Select ReservaSala.*,SalaEventos.id,SalaEventos.numero,Reserva.codigoReserva from ReservaSala inner join SalaEventos inner join Reserva on ReservaSala.idSala = SalaEventos.id and Reserva.id = ReservaSala.idReserva and ReservaSala.idReserva = ? and ReservaSala.estado='a'");
            pst.setInt(1, ReservaDAO.consultar(codigoReserva).getId());
            rs = pst.executeQuery();
            while (rs.next()) {
                ReservaSala rsa = ReservaSala.cargarDatos(rs);
                resultados.add(rsa);
            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return resultados;
        }
    }

    public static void actualizar(ReservaSala reservaSala) throws SQLException, Exception {

        PreparedStatement pst = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("Update ReservaSala set fechaProg=?, horaInicio=?, horaFin=?, descripcion=?,idSala=? WHERE  id=?");
            pst.setTimestamp(1, new Timestamp(reservaSala.getFechaProg().getTime()));
            pst.setString(2, reservaSala.getHoraInicio());
            pst.setString(3, reservaSala.getHoraFin());
            pst.setString(4, reservaSala.getDescripcion());
            pst.setInt(5, reservaSala.getSala().getId());
            pst.setInt(6, reservaSala.getId());
            pst.executeUpdate();

        } finally {
            if (pst != null) {
                pst.close();
            }
        }

    }

    public static List consultarCheckables(Reserva reserva, java.util.Date fecha) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        resultados = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("select ReservaSala.*, SalaEventos.id, SalaEventos.numero,Reserva.codigoReserva from ReservaSala, SalaEventos, Reserva where ReservaSala.idSala = SalaEventos.id and ReservaSala.idReserva = Reserva.id and ReservaSala.fechaProg = ? and idReserva = ? and ReservaSala.estado='a';");
            pst.setTimestamp(1, new Timestamp(fecha.getTime()));
            pst.setInt(2, reserva.getId());
            rs = pst.executeQuery();

            while (rs.next()) {
                if(resultados==null)
                    resultados = new LinkedList<ReservaSala>();
                resultados.add(ReservaSala.cargarDatos(rs));
            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return resultados;
        }
    }

    public static void cambiarEstado(ReservaSala reserva, char estado) throws SQLException, Exception {
        PreparedStatement pst = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("Update ReservaSala set estado=? WHERE  id = ?;");
            pst.setString(1, estado+"");
            pst.setInt(2, reserva.getId());
            pst.executeUpdate();

        } finally {
            if (pst != null) {
                pst.close();
            }
        }

    }
}
